package com.video;

/*
 * @author：周洋帆
 * @description：计算DivRank算法各个部分需要的初始值，例如p*，trans[i][j].
 * @param:
 *     list1,list2:优酷土豆信息
 *     commend：命令，决定是用优酷还是土豆。
 * @see:
 *     WordSeg（text）：将text（语句）分成单词。
 *     compraeXXX：计算标题或标签，或tag的相似度。
 *     initialTrans:由compare函数得到节点边与边之间的联系，然后归一化得到初始转移概率。
 *     initialP：根据视频火热程度（播放数）来决定随机转移各个部分概率大小（p*）
 * @return:
 *     WordSeg(text):返回由text拆分的单词列表。
 *     compareXXX：返回具体的比较值，用于决定顶点与顶点之间的联系。
 *     initialTrans：返回计算后的转移概率
 *     initialP：返回计算后的p*。
 *   
 */

import java.io.*;
import java.util.ArrayList;
import java.util.List;


import org.ansj.domain.Term;
import org.ansj.library.UserDefineLibrary;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.ansj.util.FilterModifWord;
import org.ansj.util.MyStaticValue;
import org.nlpcn.commons.lang.tire.domain.Forest;
import org.nlpcn.commons.lang.util.IOUtil;
import org.wltea.analyzer.core.IKSegmenter;
import org.wltea.analyzer.core.Lexeme;

public class ComputeInitial {
	private List<YoukuInfo>list1=null;
	private List<TudouInfo>list2=null;
	private String commend=null;
	private int number=100;

	public ComputeInitial(List<YoukuInfo>list1,List<TudouInfo>list2,String commend){
		this.list1=list1;
		this.list2=list2;
		this.commend=commend;
		if(commend.equals("youku")){
			number=SearchAction.youkuNumber;
		}
		if(commend.equals("tudou")){
			number=SearchAction.tudouNumber;
		}
		
		// 加载自定义用户词典
/*	    try {
	      Forest FOREST = new Forest();
	      // 加载用户自定义词典
	      UserDefineLibrary.loadLibrary(FOREST, "library/default.dic");
	    } catch (Exception e) {
	      // TODO Auto-generated catch block
	      e.printStackTrace();
	    }	*/
	    
	    // 加载停止词典，主要为了提取关键词，在对比相似度上，个人感觉只要去了的即可。
/*	    try{
	    	 String temp=null;
	    	 BufferedReader br=null;
	    	 File file=new File("library/newWordFilter.dic");
	    	 br = IOUtil.getReader(new FileInputStream(file), "UTF-8");
				while ((temp = br.readLine()) != null) {
					if(temp!="\n"){
						FilterModifWord.insertStopWord(temp) ;	
					}
				}
	    	 
	    }catch(IOException e){e.printStackTrace();}*/
	    
	    
	}
	

	public List<String> WordSeg(String text){
		List<String> result = new ArrayList<String>();
		IKSegmenter ik = new IKSegmenter(new StringReader(text),true);
		
		try{
			Lexeme work=null;
			while((work=ik.next())!=null){
				result.add(work.getLexemeText());
			}
		}catch(IOException e){e.printStackTrace();}
		  
		return result;
		
		
		
		
		
	}
	
	public double compareTitle(String t1,String t2){
		double result=0;
		int simCount=0;
		List<String>l1=WordSeg(t1);
		List<String>l2=WordSeg(t2);
		for(int i=0;i<l1.size();i++){
			String temp=l1.get(i);
			if(l2.contains(temp)){
				simCount++;
//				System.out.println(temp+"\t"+l1.toString());
			}
		}
		result=(simCount+0.0)/(l1.size()+l2.size()-simCount);
/*		System.out.println("共同的为"+simCount+"\t"+"LIst1长度: "+l1.size()+"\t"
		      +"List2长度: "+l2.size());*/
		return result;
		
	}
	
	public double compareTags(String tag1,String tag2){
		double result=0;
		String[] t1=tag1.split(",");
		String[] t2=tag2.split(",");
		int count=0;
		for(int i=0;i<t1.length;i++){
			for(int j=0;j<t2.length;j++){
				if(t1[i].equals(t2[j]))
					count++;
			}
		}
		result=count/40.0;
		return result;
	}
	
	public double compareCategory(String c1,String c2)
	{
		double result=0;
		if(c1.equals(c2))
			result=1.0/20;
		return result;
	}
	
	public double computeWeight(int i,int j){
		double result=0;
		if(commend.equals("youku")){
			String title1=list1.get(i).getVideoName();
			String title2=list1.get(j).getVideoName();
			String tag1=list1.get(i).getTags();
			String tag2=list1.get(j).getTags();
			String category1=list1.get(i).getCategory();
			String category2=list1.get(j).getCategory();
			result=compareTitle(title1,title2)+compareTags(tag1,tag2)
			 +compareCategory(category1,category2);
			
		}
		if(commend.equals("tudou")){
			String title1=list2.get(i).getVideoName();
			String title2=list2.get(j).getVideoName();
			String tag1=list2.get(i).getTags();
			String tag2=list2.get(j).getTags();
			result=compareTitle(title1,title2)+compareTags(tag1,tag2);
		}
		return result;
	}
	
	public double[][] initialTrans(double a){
		double[][] result=new double[number][];
		double[][]weight=new double[number][];
	    //初始化数组	
	    for(int i=0;i<number;i++){
			result[i]=new double[number];
			weight[i]=new double[number];
		}

	     //计算i=j的情况
	    for(int i=0,j=0;i<number&&j<number;i++,j++){
		   result[i][j]=1-a;
	    }
		for(int i=0;i<number;i++){
			for(int j=0;j<i;j++){
				weight[i][j]=computeWeight(i,j);
				weight[j][i]=weight[i][j];
			}
			
		}
		for(int i=0;i<number;i++){
			double temp=0;
			for(int j=0;j<number;j++){
				if(i!=j){
					temp=temp+weight[i][j];
				}	
			}
			if(temp==0){
				for(int j=0;j<number;j++){
					if(i!=j){
						result[i][j]=0;
					}
				}
			}else{
				for(int j=0;j<number;j++){
					if(i!=j){
						result[i][j]=((weight[i][j]+0.0)/temp)*a;
					}
				}
			}
			
		}
		
		return result;
	}
	
	public double[] initialP(){
		long[]play=new long[number];
		double[] result=new double[number];
		long sum=0;
		if(commend.equals("youku")){
			for(int i=0;i<number;i++){
				play[i]=list1.get(i).getViewCount();
			}
		}
		if(commend.equals("tudou")){
			for(int i=0;i<number;i++){
				play[i]=list2.get(i).getPlayTimes();
			}
		}
		for(int i=0;i<number;i++){
			play[i]+=400000;
			sum=sum+play[i];
		}
		for(int i=0;i<number;i++){
			result[i]=(play[i]+0.0)/sum;
		}
		return result;
	}
	
}
	
	 
